// 对 axios 的二次封装，目的：使用请求与响应拦截器
import axios from 'axios'
import { ElMessage } from 'element-plus'
// 引入用户相关仓库，需要用到token
import useUserStore from '@/store/modules/user'
// 引入 router
import router from '@/router/index.js'

// nprogress 进度条
import nprogress from 'nprogress'
import 'nprogress/nprogress.css'
nprogress.configure({showSpinner: false}) // 去掉进度条加载的圈圈

// 第一步：新建一个 axios 实例（配置：基础路径，超时时间）
let request = axios.create({
    // 基础路径，使用开发环境中的变量
    baseURL: import.meta.env.VITE_APP_BASE_API, // 基础路径上会携带 /api
    // baseURL: '/api',
    // 超时时间
    timeout: 5000
})

// 第二步：request 实例添加请求拦截器
request.interceptors.request.use((config) => {
    // 进度条开始
    nprogress.start()
    // 获取用户小仓库：需要用到token
    let userStore = useUserStore()
    // config 配置对象中，headers属性请求头，经常给服务器端携带公共参数，如token
    if(userStore.token){
        config.headers.token = userStore.token
        config.headers.Authorization = userStore.token
    }
    return config
})

// 第三部：request 实例添加响应拦截器
request.interceptors.response.use((response) => {
    // 进度条结束
    nprogress.done() 
    // 成功回调
    // 简化数据
    if(response.data.status == 401){ // token过期跳转至登录页
        router.push('/login')
    }
    return response.data
}, (error) => {
    // 失败回调，处理http网络错误
    // 定义一个变量，存储网络错误的信息
    // let message = ''
    // http 状态码
    // let status = error.response.status
    // switch(status){
    //     case 401:
    //         message = 'token过期'
    //         break
    //     case 403:
    //         message = '无权访问'
    //         break
    //     case 404:
    //         message = '请求地址错误'
    //         break
    //     case 500:
    //         message = '服务器出现问题'
    //         break
    //     default:
    //         message = '网络出现问题'
    //         break
    // }
    // 提示错误信息
    ElMessage({
        type: 'error',
        message: error.response.data.msg
    })
    // reject() 可直接返回 Promise 失败对象
    console.log('-----')
    return Promise.reject(error)
})

// 对外暴露
export default request